package com.atguigu.tingshu.order.template;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

public abstract class OrderConfirmTemplate {

    @Autowired
    private RedisTemplate redisTemplate;

    public OrderInfoVo confirm(TradeVo tradeVo){
        // 创建一个订单确认页所需的vo模型
        OrderInfoVo orderInfoVo = new OrderInfoVo();
        // 生成交易号（订单编号），防重的唯一标识（幂等性）
        String tradeNo = IdWorker.getIdStr();
        orderInfoVo.setTradeNo(tradeNo);
        // 为了保证提交订单的幂等性，缓存唯一标识，将来提交订单时可以进行查询，如果存在则说明没有重复提交可以提交并删除，如果不存在则说明重复提交
        this.redisTemplate.opsForValue().set(RedisConstant.USER_TRADE_PREFIX + tradeNo,
                tradeNo, RedisConstant.USER_TRADE_TIMEOUT, TimeUnit.SECONDS);
        // 设置默认的支付方式
        orderInfoVo.setPayWay(SystemConstant.ORDER_PAY_WAY_WEIXIN);
        // 设置交易类型
        orderInfoVo.setItemType(tradeVo.getItemType());
        // 调用模板方法
        this.trade(orderInfoVo, tradeVo);
        // 设置时间戳和签名
        orderInfoVo.setTimestamp(SignHelper.getTimestamp());
        orderInfoVo.setSign(SignHelper.getSign(JSON.parseObject(JSON.toJSONString(orderInfoVo), HashMap.class)));
        // 返回vo模型
        return orderInfoVo;
    }

    public abstract void trade(OrderInfoVo orderInfoVo, TradeVo tradeVo);
}
